﻿#ifndef BDPCCODER_H
#define BDPCCODER_H

#include "BDPcCoder_global.h"
#include "BDApiCoder.h"

class BDPcCoder
{

public:
  BDPcCoder();
  ~BDPcCoder();

  //<初始化/释放编解码句柄>
  bool InitCoderHeadle(E_BDUART eUart);
  void FreeCoderHeadle();


  //<以下是编码(打包)接口>
  //!< 函数：bool CoderICRData(const T_BDICRDATA*, T_BDRSDATA*);
  //!< 功能：将ICR数据tData打包为tRSData（eg：将{0,0}打包为{"$BDICR,0,0*58\r\n",15}）
  //!< 返回值：成功返回true
  bool CoderICRData(const T_BDICRDATA *tData, T_BDRSDATA *tRSData);     //!< ICR
  bool CoderTCQData(const T_BDTCQDATA *tData, T_BDRSDATA *tRSData);     //!< TCQ
  bool CoderTBQData(const T_BDTBQDATA *tData, T_BDRSDATA *tRSData);     //!< TBQ
  bool CoderMSSData(const T_BDMSSDATA *tData, T_BDRSDATA *tRSData);     //!< MSS
  bool CoderEPQData(const T_BDEPQDATA *tData, T_BDRSDATA *tRSData);     //!< EPQ
  //!< 函数：bool CoderCMDData(const char*, const u4, T_BDRSDATA*);
  //!< 功能：将长度为uLen的数据sData打包为tRSData,注:这里主要是校验（eg:将
  //!<      长度为10的"$BDICR,0,0"打包为{"$BDICR,0,0*58\r\n",15}）
  //!< 返回值：成功返回true
  bool CoderCMDData(const char *sData, const u4 uLen, T_BDRSDATA *tRSData);//!< CMD


  //<以下是解码(解包)接口>
  //!< 函数：int PutDataToDecoder(u1 pInputData);
  //!< 功能：将串口/网口收到BD数据的注入到解码器中（解码器解包成功后会调用已注册的回调函数将数据传出去）
  //!< 返回值：返回解码出数据的条数
  int PutDataToDecoder(u1 pInputData);
  //!< 函数：bool SetDecoderCallBackFunc(pDecoderCallBackFunc, E_BDPROTOCOL);
  //!< 功能：注册回调函数（解码器解包成功后会调用已注册的回调函数将数据传出去）
  //!< 参数：pFunc：要注册的回调函数地址
  //!<      eProtoccol：回调函数对应的
  //!< 返回值：成功返回true
  bool SetDecoderCallBackFunc(pDecoderCallBackFunc pFunc, E_BDPROTOCOL eProtoccol);

  //!< 密测打桩开关  nh-20220808
  void  SetSecretTestSwitch(int iSwitch=0);


private:
  CoderBDApi*   m_cCoderHandle;   //!< 北斗协议的编解码句柄
  E_BDUART      m_eCurrentUart;   //!< 当前协议句柄的枚举值
  T_BDRSDATA    m_tRecvData;      //!< 接收到用户的数据
  T_DECODERCALLBACKFUNC m_tDecoderCallBackFunc[E_BDPROTOCOL_MAX];  //!< 注册回调函数的句柄

};

#endif // BDPCCODER_H
